#pragma once
#include "LoadImages.h"
#include "transparentimage3.h"
#include "Battle.h"
#include "Global.h"
#include "structInit.h"
#include "GameShop.h"
#include "TurnChar.h"
#include <fstream>
#include "GameInit.h"
#include "GameVectory.h"
#include "Shop.h"
#include "GameSettlement.h"
#include "AutoMusic.h"
#include <iostream>
/*
	功能:Convey:实现楼层的传送功能

	1、获取窗口句柄：使用 GetHWnd() 函数获取当前窗口的句柄，用于后续弹出消息框。
	2、判断上楼还是下楼：
		（1）如果角色走到上楼图标：
			直接传送到下一层；
			检查当前楼层加 1 是否小于用户去过的最高楼层（level + 1 < highlevel）。
			若满足条件，将当前楼层 level 加 1，并调用 Draw() 函数重新绘制地图以显示新楼层的信息。

		（2）如果角色走到下楼图标：
			 传送至下一层;
			 检查当前楼层是否大于 0（level >=0）。
			 若满足条件，将当前楼层 level 减 1，并调用 Draw() 函数重新绘制地图。
			 若不满足条件，弹出提示信息告知用户已经在最底层，无法下楼。

	void Convey_floor() {
	if (level + 1 < highlevel) {
		level++;  // 上楼
	} else if (level - 1 >= 0) {
		level--;  // 下楼
	}
	FindRole() //找到角色在新楼层的位置
	Draw();    // 重新绘制地图
}

*/
// 楼层传送
void Convey_floor(int newcell);
/*
	功能:Draw:绘制地图

	通过遍历地图数组去绘制地图（行16*列16的地图）
	1、首先将要加载的图片重新命名（例如：墙壁-> 1.jpg）格式的文件
	2、然后根据图片在地图所在的初始位置进行地图的绘制

	//绘制侧面属性栏的属性信息
	1、通过turnchar 函数将整形数据转换至字符型数据
	2、在侧边栏的对应的属性位置 填充对应的属性信息

	参数:void
	返回值:void

	void Draw() {

	int i,j; //获取对应的图片位置
	int x,y; //根据图片的尺寸大小设置显示位置
	// 遍历当前楼层的地图
	for (int i = 0; i < 16; i++) 根据地图的边界设置判断的边界
	{
		for (int j = 0; j < 16; j++)
		{
			// 计算绘制位置
			x = j * SIZE;  // 列坐标 * 图片尺寸宽度
			y = i * SIZE;  // 行坐标 * 图片尺寸高度

			// 绘制图片
			putimage(x, y, &img[GameMap[level][i][j]]);
		}
	}

	// 绘制角色
	int rolex = col * SIZE;
	int roley = row * SIZE;
	putimage(rolex, roley, &roleimage);  // 角色图片存储在 roleimage中
}


*/
void Draw();
/*
	功能:FindRole:定位角色位置

	角色在地图中用 固定的值 表示
	通过循环遍历地图中所有格子，找到角色在地图中出现的位置

	如果找到将对应的下标 赋值给全局变量 row，col
	（注意:row,col是 数据定义中的全局变量）

	参数:void
	返回值:void

	例如：
	void FindRole() {
	// 遍历当前楼层的地图
	for (int i = 0; i < 16; i++) {
		for (int j = 0; j < 16; j++) {
			// 判断当前位置是否是角色
			if (当前位置是否为角色(根据角色在GameMap地图中所标明的值去判断)) {

				// 更新全局变量 row 和 col
				row = i;
				col = j;
				return;  // 找到角色后直接返回
			}
		}
	}
*/
void FindRole();
/*
	功能:GameDetect:游戏的核心操作
	1、处理玩家输入:
		通过 peekmessage 或 _kbhit 获取玩家的键盘输入。
		根据输入（如 WASD 或方向键）判断玩家的移动方向。

	2、移动逻辑：
		根据玩家输入的方向，计算移动后的新位置 (newRow, newCol)。
		检查新位置是否合法（是否在地图范围内）。
		根据新位置的内容（如墙壁、怪物、物品、门等）执行相应的操作。

	3、战斗逻辑：
		如果玩家走到的位置是怪物，进入战斗逻辑，调用Battle()函数。
		根据玩家和怪物的属性计算战斗结果，更新玩家和怪物的状态。
		（如果玩家获胜，玩家扣除战斗过程中造成的相应的损耗。并且怪物在地图中消失（即玩家走到怪物所在的位置进行代替））

	4、物品拾取逻辑：
		如果玩家走到的位置是物品（如钥匙、药水等），更新玩家的属性（如血量、攻击力、钥匙数量等）。
		移除地图上的物品（即玩家走到物品所在的位置进行代替）。

	5、开门逻辑：
		如果新位置是门，检查玩家是否有对应的钥匙。
		如果有钥匙，开门并减少钥匙数量；否则，阻止玩家移动，玩家无法进行移动(需重新在地图中查询钥匙)。

	6、楼层传送逻辑：
		如果玩家走到的位置是楼梯，调用 Convey_floor 函数进行楼层传送（即进入新地图）。

	7、更新玩家位置：
		如果移动合法且没有阻碍，更新玩家的位置 (全局变量:row, col)。

		(这里的i，j代表的玩家进行方向操作后，需要进行判断的操作）

	操作示例:
	void GameDetect() {
	// 获取玩家输入
	if (_kbhit()) { //判断键盘是否被按下

		// 定义一个char类型的变量，通过_getch()获取键盘输入

		// 计算移动后的新位置（设置两个变量来获取玩家的坐标位置，并更新 全局变量 row col的值）

		switch (根据输入的值进行判断) {
			case 'w': case 'W': case 72:  // 上
				新定义的 横坐标值-- ;
				break;
			case 's': case 'S': case 80:  // 下
				新定义的 横坐标值++  ;
				break;
			case 'a': case 'A': case 75:  // 左
				新定义的 纵坐标值-- ;
				break;
			case 'd': case 'D': case 77:  // 右
				新定义的 横坐标值++ ;
				break;
			default:
				break;  // 忽略其他输入
		}

		// 检查新位置是否在地图范围内
		if (地图是否越界) {
			return;  // 超出地图范围，不移动
		}

		// 获取新位置的内容
		int newPos = 获取的是在三维数组中对应位置的 值，根据在地图中对应位置的值进行处理操作;

		// 根据新位置的内容执行操作
		switch (newCell) {
			case 0:  // 空地
				// 更新玩家位置
				Gamemap[level][row][col] = 0;  // 原位置设为空地
				row = newRow;
				col = newCol;
				Gamemap[level][row][col] = 16;  // 新位置设为玩家
				break;

			case 1:  // 墙壁
				// 无法移动
				break;

			case 2:  // 黄门
				if (roleman.ykey > 0) {
					// 消耗一把黄钥匙
					Gamemap[level][newRow][newCol] = 0;  // 开门
				}
				break;

			case 3:  // 蓝门
				if (roleman.bkey > 0) {
					roleman.bkey--;  // 消耗一把蓝钥匙
					Gamemap[level][newRow][newCol] = 0;  // 开门
				}
				break;

			case 4:  // 黄钥匙
				roleman.ykey++;  // 拾取黄钥匙
				Gamemap[level][newRow][newCol] = 0;  // 移除钥匙
				break;

			case 5:  // 蓝钥匙
				roleman.bkey++;  // 拾取蓝钥匙
				Gamemap[level][newRow][newCol] = 0;  // 移除钥匙
				break;

			case 6:  // 红药水
				roleman.HP += 100;  // 增加血量
				Gamemap[level][newRow][newCol] = 0;  // 移除药水
				break;

			case 7:  // 蓝药水
				roleman.bcap += 50;  // 增加蓝量
				Gamemap[level][newRow][newCol] = 0;  // 移除药水
				break;

			case 8:  // 绿史莱姆
			case 9:  // 红史莱姆
			case 10: // 蝙蝠
			case 11: // 骷髅人
			case 12: // 骷髅士兵
			case 13: // 法师
				// 进入战斗逻辑
				if (Fight(&roleman, &monsters[newCell - 8])) {
					Gamemap[level][newRow][newCol] = 0;  // 怪物被击败，移除怪物
				} else {
					// 玩家被击败，游戏结束
					// 玩家需重新开始游戏，从地图的第一层进行
					GameOver();
				}
				break;

			case 14: // 上楼
				Convey_floor();  // 传送到上一层
				break;

			case 15: // 下楼
				Convey_floor();  // 传送到下一层
				break;

			default:
				break;
		}
	}
}

*/
void GameDetect();
void DrawEnd();